package com.ahwei.common.mybatis.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
 * <p>
 * 这是一个Java文件！
 * </p>
 *
 * @author： ahWei
 * @email：ahwei163@qq.com
 * @since： 2022-05-25 14:55:28
 */
public class MpGenerator {
    public void generator(String projectPath, String projectName, String author, String url, String username, String password, String[] table_names, String[] tablePrefix, boolean hasSuperEntity, String[] superEntityColumns, String packageName, String moduleName) {
        // 1. 创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2. 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(projectPath + projectName + "/src/main/java");
        gc.setAuthor(author);
        gc.setFileOverride(true);
        gc.setOpen(false);
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);
        gc.setIdType(IdType.ASSIGN_ID);
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setSwagger2(false);
        mpg.setGlobalConfig(gc);

        // 3. 数据库配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUrl(url);
        dsc.setUsername(username);
        dsc.setPassword(password);
        dsc.setDbType(DbType.MYSQL);
        // 设置mysql中的字段类型和java中属性类型的对应关系
        dsc.setTypeConvert(new MySqlTypeConvertCustom());
        mpg.setDataSource(dsc);

        // 4. 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 设置表名
        strategy.setInclude(table_names);
        // 表名前缀，映射到实体名称去掉
        strategy.setTablePrefix(tablePrefix);
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 实体类使用lombok注解
        strategy.setEntityLombokModel(true);

        if (hasSuperEntity) {
            strategy.setSuperEntityClass("com.ahwei.common.mybatis.base.BaseEntity");
            // 写于父类中的公共字段
            strategy.setSuperEntityColumns(superEntityColumns);
        }
        // 生成REST控制器
        strategy.setRestControllerStyle(true);
        //url中驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);

        // 逻辑删除字段名
        strategy.setLogicDeleteFieldName("is_deleted");
        // Boolean字段是否移除is前缀
        strategy.setEntityBooleanColumnRemoveIsPrefix(true);

        mpg.setStrategy(strategy);

        // 5. 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(packageName);
        pc.setModuleName(moduleName);
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setXml("mapper");
        mpg.setPackageInfo(pc);

        mpg.execute();
    }
}

/**
 * MyBatis-Plus 3.3.1中自动生成代码tinyint(1)无法自动转换为Boolean的解决办法。
 * 1.在测试类中新建一个类MySqlTypeConvertCustom，继承MySqlTypeConvert并实现ITypeConvert后覆盖processTypeConvert方法。
 * 2.在generator中使用自己创建的类的对象。
 */
class MySqlTypeConvertCustom extends MySqlTypeConvert implements ITypeConvert {
    @Override
    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
        String t = fieldType.toLowerCase();
        String mysqlColumn = "tinyint";

        if (t.contains(mysqlColumn)) {
            return DbColumnType.BOOLEAN;
        }
        return super.processTypeConvert(globalConfig, fieldType);
    }
}